#pragma once

#include <stdint.h>

// 宏定义：控制DLL导出/导入行为
// 当定义PINEA_BUILD_DLL时，编译为导出（供DLL自身使用）
// 否则为导入（供使用DLL的程序使用）
#ifdef PINEA_BUILD_DLL
#define PINEA_API __declspec(dllexport)
#else
#define PINEA_API __declspec(dllimport)
#endif

// 事件类型定义
#define PINEA_EVENT_QUIT 0x100				// 窗口退出事件
#define PINEA_EVENT_KEY_DOWN 0x300			// 按键按下事件
#define PINEA_EVENT_KEY_UP 0x301			// 按键释放事件
#define PINEA_EVENT_MOUSE_MOTION 0x400		// 鼠标移动事件
#define PINEA_EVENT_MOUSE_BUTTON_DOWN 0x401 // 鼠标按键按下事件
#define PINEA_EVENT_MOUSE_BUTTON_UP 0x402	// 鼠标按键释放事件
#define PINEA_EVENT_MOUSE_WHEEL 0x403		// 鼠标滚轮事件

// 按键码定义
#define PINEA_KEY_SPACE 0x00000020 // 空格键
#define PINEA_KEY_A 0x00000061	   // A键
#define PINEA_KEY_D 0x00000064	   // D键
#define PINEA_KEY_S 0x00000073	   // S键
#define PINEA_KEY_W 0x00000077	   // W键
#define PINEA_KEY_H 0x00000068	   // H键
#define PINEA_KEY_J 0x0000006a	   // J键
#define PINEA_KEY_K 0x0000006b	   // K键
#define PINEA_KEY_L 0x0000006c	   // L键

// 图像翻转模式
#define PINEA_FLIP_HORIZONTAL 0x00000001 // 水平翻转
#define PINEA_FLIP_VERTICAL 0x00000002	 // 垂直翻转

// 事件结构体：存储事件相关信息
struct PineaEvent {
	int type; // 事件类型（对应PINEA_EVENT_*宏）
	int key;  // 按键码（当事件为键盘事件时有效）
	int x;	  // x坐标（当事件为鼠标事件时有效）
	int y;	  // y坐标（当事件为鼠标事件时有效）
};

// 颜色结构体：RGBA格式（每个分量0-255）
struct PineaColor {
	uint8_t r; // 红色分量
	uint8_t g; // 绿色分量
	uint8_t b; // 蓝色分量
	uint8_t a; // 透明度分量（alpha）
};

// 矩形结构体：用于表示位置和大小
struct PineaRect {
	float x; // 左上角x坐标
	float y; // 左上角y坐标
	float w; // 宽度
	float h; // 高度
};

// 图像结构体：存储图像资源信息
struct PineaImage {
	void* texture; // 底层纹理数据（平台相关）
	int width;	   // 图像宽度
	int height;	   // 图像高度
};

// 音频结构体：存储音频资源信息
struct PineaAudio {
	void* audio; // 底层音频数据（平台相关）
};

// 外部C链接：确保C++编译时按C方式导出函数（避免名称修饰）
extern "C" {
// 窗口相关函数
PINEA_API void pineaInit(const char* title, int width, int height); // 初始化窗口
PINEA_API void pineaQuit();											// 退出并释放资源
PINEA_API void pineaShow();											// 显示窗口
PINEA_API bool pineaPollEvent(PineaEvent* event);					// 处理事件队列（返回是否有事件）
PINEA_API void pineaClear(const PineaColor* color);					// 清空屏幕（使用指定颜色）
PINEA_API void pineaRender();										// 刷新渲染（将绘制内容显示到屏幕）

// 图像绘制相关函数
PINEA_API void pineaFillRect(const PineaRect* rect, const PineaColor* color); // 绘制填充矩形
PINEA_API PineaImage* pineaLoadImage(const char* path);						  // 加载图像文件
PINEA_API void pineaDrawImage(PineaImage* image, const PineaRect* srcRect,	  // 绘制图像
	const PineaRect* dstRect, double angle, int flip);
PINEA_API void pineaDropImage(PineaImage* image); // 释放图像资源

// 音频播放相关函数
PINEA_API PineaAudio* pineaLoadMusic(const char* path);		 // 加载音乐文件（长时间播放的音频）
PINEA_API void pineaPlayMusic(PineaAudio* audio, bool loop); // 播放音乐（loop：是否循环）
PINEA_API void pineaPauseMusic();							 // 暂停音乐
PINEA_API void pineaResumeMusic();							 // 恢复播放音乐
PINEA_API void pineaStopMusic();							 // 停止播放音乐
PINEA_API void pineaDropMusic(PineaAudio* audio);			 // 释放音乐资源
PINEA_API PineaAudio* pineaLoadSound(const char* path);		 // 加载音效文件（短时间播放的音频）
PINEA_API void pineaPlaySound(PineaAudio* audio, int loops); // 播放音效（loops：循环次数）
PINEA_API void pineaDropSound(PineaAudio* audio);			 // 释放音效资源

// 时间相关函数
PINEA_API uint64_t pineaGetTime(); // 获取当前时间（单位：纳秒）
}